
/*
 * @Author: your name
 * @Date: 2020-08-12 20:34:19
 * @LastEditTime: 2020-08-12 20:54:27
 * @LastEditors: Please set LastEditors
 * @Description: In User Settings Edit
 * @FilePath: \day01\demo8\main.go
 */
package main

import (
	"fmt"
	"log"
	"net"
	"time"

	"github.com/shirou/gopsutil/cpu"
	"github.com/shirou/gopsutil/disk"
	"github.com/shirou/gopsutil/host"
	"github.com/shirou/gopsutil/load"
	"github.com/shirou/gopsutil/mem"
	n "github.com/shirou/gopsutil/net"
)

// gopsutil
// 采集CPU先关信息
func getCpuInfo() {
	cpuInfos, err := cpu.Info()
	if err != nil {
		fmt.Printf("get cpu info failed, err:%v", err)
	}
	for _, ci := range cpuInfos {
		fmt.Println(ci)
	}
	// cpu 使用率
	for {
		precent, _ := cpu.Percent(time.Second, false)
		fmt.Println(precent)
	}
}

// 获取CPU负载信息
func getCpuLoad() {
	info, _ := load.Avg()
	fmt.Printf("%v\n", info)
}

// memory
func getMemInfo() {
	memInfo, _ := mem.VirtualMemory()
	fmt.Printf("mem %v", memInfo)
}

// Host
func getHost() {
	hInfo, _ := host.Info()
	fmt.Printf("host:%v\n", hInfo)
}

// get disk
func getDiskInfo() {
	parts, err := disk.Partitions(true)
	if err != nil {
		fmt.Printf("err :%v\n", err)
	}
	for _, part := range parts {
		fmt.Printf("part:%v\n", part)
		diskInfo, _ := disk.Usage(part.Mountpoint)
		fmt.Printf("disk info:used:%v free:%v\n", diskInfo.UsedPercent, diskInfo.Free)
	}
	ioStat, _ := disk.IOCounters()
	for k, v := range ioStat {
		fmt.Printf("%v:%v", k, v)
	}

}

// net IO
func getNetInfo() {
	info, _ := n.IOCounters(true)
	for index, v := range info {
		fmt.Printf("%v:%v", index, v)
	}
}

// 获取本机IP
// Get preferred outbound ip of this machine
func GetOutboundIP() string {
	conn, err := net.Dial("udp", "8.8.8.8:80")
	if err != nil {
		log.Fatal(err)
	}
	defer conn.Close()

	localAddr := conn.LocalAddr().(*net.UDPAddr)
	fmt.Println(localAddr.String())
	return localAddr.IP.String()
}
func main() {
	// getCpuInfo()
	// getCpuLoad()
	// getMemInfo()
	// getHost()
	// getDiskInfo()
	"time"
)

// 时间类型有一个自带的方法Format进行格式化，
// 需要注意的是Go语言中格式化时间模板不是常见的Y-m-d H:M:S
// 而是使用Go的诞生时间2006年1月2号15点04分（记忆口诀为2006 1 2 3 4）。也许这就是技术人员的浪漫吧。

// 定时任务,每一秒执行，执行的方法，是通过channel来加入之后执行的
func main() {
	// track := time.Tick(time.Second)
	// for i := range track {
	// 	fmt.Println(i)
	// }
	// time 格式化
	now := time.Now()
	fmt.Println(now.Format("2006-01-02 15:04:05"))

	// 解析字符串时间格式
	fmt.Println("======================================")
	fmt.Println(now)
	loc, err := time.LoadLocation("Asia/Shanghai")
	if err != nil {
		fmt.Println(err)
		return
	}
	fmt.Println(loc)
	timeObj, err := time.ParseInLocation("2006-01/02 15:04:05", "2019-08/04 14:15:20", loc)
	if err != nil {
		fmt.Println(err)
		return
	}
	fmt.Println(timeObj)
	fmt.Println(timeObj.Sub(now))

}
